00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028 #include "deGlobalTypes.hpp"
00029 #include "deMemory_priv.hpp"
00030
00031 #ifndef REDBLACK_TREE_HPP
00032 #define REDBLACK_TREE_HPP
00033
00034
00035
00036
00037 #define REDBLACKNODE_FREE 0x0000
00038 #define REDBLACKNODE_ALLOC 0x0001
00039
00040
00041 #define SetNodeFree(Node) Node->Type = Node->Type & ~REDBLACKNODE_ALLOC;
00042 #define SetNodeAlloc(Node) Node->Type = Node->Type | REDBLACKNODE_ALLOC;
00043
00044
00045 #define IsNodeFree(Node) (!IsNodeAlloc(Node))
00046 #define IsNodeAlloc(Node) (Node->Type & REDBLACKNODE_ALLOC)
00047
00048
00049
00050 #define REDBLACKNODE_BLACK 0x0000
00051 #define REDBLACKNODE_RED 0x0002
00052
00053
00054 #define SetNodeBlack(Node) Node->Type = Node->Type & ~REDBLACKNODE_RED;
00055 #define SetNodeRed(Node) Node->Type = Node->Type | REDBLACKNODE_RED;
00056
00057
00058 #define IsNodeBlack(Node) (!IsNodeRed(Node))
00059 #define IsNodeRed(Node) (Node->Type & REDBLACKNODE_RED)
00060
00061
00062
00063 typedef struct RedBlackNode
00064 {
00065 DWORD Type;
00066 struct RedBlackNode *Left;
00067 struct RedBlackNode *Right;
00068 struct RedBlackNode *Parent;
00069
00070 struct RedBlackNode *LinkedLeft;
00071 struct RedBlackNode *LinkedRight;
00072
00073
00074 DWORD Size;
00075 void * Ptr;
00076
00077 union
00078 {
00079 void *ExtraData;
00080 struct RedBlackNode *Brother;
00081 };
00082 } RedBlackNode;
00083
00084
00085 extern RedBlackNode RedBlackNULLNode;
00086
00087
00088
00089
00090
00091
00092
00093
00094
00095
00096 deBoolean InsertRedBlackTreeNodeAlloc(RedBlackNode **Root, RedBlackNode *AllocNode);
00097 deBoolean InsertRedBlackTreeNodeFree(RedBlackNode **Root, RedBlackNode *FreeNode);
00098 void DeleteRedBlackTreeNode(RedBlackNode **Root, RedBlackNode *Node);
00099
00100
00101 RedBlackNode *FindRedBlackTreeNodeAlloc(RedBlackNode *Root, void *Ptr);
00102 RedBlackNode *FindClosestRedBlackTreeNodePtr(RedBlackNode *Root, void *Ptr);
00103 RedBlackNode *FindRedBlackTreeNodeFree(RedBlackNode *Root, DWORD Size);
00104
00105 #endif